home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Source / GNU / cc / gen-protos.c < prev    next >
C/C++ Source or Header  |  1993-11-29  |  4KB  |  156 lines

  1. /* gen-protos.c - massages a list of prototypes, for use by fixproto.
  2.    Copyright (C) 1993 Free Software Foundation, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or modify it
  5. under the terms of the GNU General Public License as published by the
  6. Free Software Foundation; either version 2, or (at your option) any
  7. later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU General Public License for more details.
  13.  
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17.  
  18. #include <stdio.h>
  19. #include <ctype.h>
  20. #include "hconfig.h"
  21. #include "scan.h"
  22.  
  23. #define HASH_SIZE 2503 /* a prime */
  24.  
  25. int hash_tab[HASH_SIZE];
  26. int verbose = 0;
  27.  
  28. sstring linebuf;
  29.  
  30. /* Avoid error if config defines abort as fancy_abort.
  31.    It's not worth "really" implementing this because ordinary
  32.    compiler users never run fix-header.  */
  33.  
  34. void
  35. fancy_abort ()
  36. {
  37.   abort ();
  38. }
  39.  
  40. int
  41. main (argc, argv)
  42.      int argc;
  43.      char** argv;
  44. {
  45.   FILE *inf = stdin;
  46.   FILE *outf = stdout;
  47.   int next_index = 0;
  48.   int i, i0;
  49.  
  50.   fprintf (outf, "struct fn_decl std_protos[] = {\n");
  51.  
  52.   for (;;)
  53.     {
  54.       int c = skip_spaces (inf, ' ');
  55.       int param_nesting = 1;
  56.       char *param_start, *param_end, *decl_start,
  57.       *name_start, *name_end;
  58.       register char *ptr;
  59.       if (c == EOF)
  60.     break;
  61.       linebuf.ptr = linebuf.base;
  62.       ungetc (c, inf);
  63.       c = read_upto (inf, &linebuf, '\n');
  64.       if (linebuf.base[0] == '#') /* skip cpp command */
  65.     continue;
  66.       if (linebuf.base[0] == '\0') /* skip empty line */
  67.     continue;
  68.  
  69.       ptr = linebuf.ptr - 1;
  70.       while (*ptr == ' ' || *ptr == '\t') ptr--;
  71.       if (*ptr-- != ';')
  72.     {
  73.       fprintf (stderr, "Funny input line: %s\n", linebuf.base);
  74.       continue;
  75.     }
  76.       while (*ptr == ' ' || *ptr == '\t') ptr--;
  77.       if (*ptr != ')')
  78.     {
  79.       fprintf (stderr, "Funny input line: %s\n", linebuf.base);
  80.       continue;
  81.     }
  82.       param_end = ptr;
  83.       for (;;)
  84.     {
  85.       int c = *--ptr;
  86.       if (c == '(' && --param_nesting == 0)
  87.         break;
  88.       else if (c == ')')
  89.         param_nesting++;
  90.     }
  91.       param_start = ptr+1;
  92.  
  93.       ptr--;
  94.       while (*ptr == ' ' || *ptr == '\t') ptr--;
  95.  
  96.       if (!isalnum (*ptr))
  97.     {
  98.       if (verbose)
  99.         fprintf (stderr, "%s: Can't handle this complex prototype: %s\n",
  100.              argv[0], linebuf.base);
  101.       continue;
  102.     }
  103.       name_end = ptr+1;
  104.  
  105.       while (isalnum (*ptr) || *ptr == '_') --ptr;
  106.       name_start = ptr+1;
  107.       while (*ptr == ' ' || *ptr == '\t') ptr--;
  108.       ptr[1] = 0;
  109.       *name_end = 0;
  110.       *param_end = 0;
  111.       *name_end = 0;
  112.  
  113.       decl_start = linebuf.base;
  114.       if (strncmp (decl_start, "typedef ", 8) == 0)
  115.     continue;
  116.       if (strncmp (decl_start, "extern ", 7) == 0)
  117.     decl_start += 7;
  118.  
  119.  
  120.       /* NOTE:  If you edit this,
  121.      also edit lookup_std_proto in fix-header.c !! */
  122.       i = hash (name_start) % HASH_SIZE;
  123.       i0 = i;
  124.       if (hash_tab[i] != 0)
  125.     {
  126.       for (;;)
  127.         {
  128.           i = (i+1) % HASH_SIZE;
  129.           if (i == i0)
  130.         abort ();
  131.           if (hash_tab[i] == 0)
  132.         break;
  133.         }
  134.     }
  135.       hash_tab[i] = next_index;
  136.  
  137.       fprintf (outf, "  {\"%s\", \"%s\", \"%s\" },\n",
  138.            name_start, decl_start, param_start, i, i0);
  139.  
  140.       next_index++;
  141.  
  142.       if (c == EOF)
  143.     break;
  144.     }
  145.   fprintf (outf, "{0, 0, 0}\n};\n");
  146.  
  147.  
  148.   fprintf (outf, "#define HASH_SIZE %d\n", HASH_SIZE);
  149.   fprintf (outf, "short hash_tab[HASH_SIZE] = {\n");
  150.   for (i = 0; i < HASH_SIZE; i++)
  151.     fprintf (outf, "  %d,\n", hash_tab[i]);
  152.   fprintf (outf, "};\n");
  153.  
  154.   return 0;
  155. }
  156.